// pages/announceResult/announceResult.js
//连接数据库
const db = wx.cloud.database();
const forecast_table = db.collection('forecast_table');
const user_table=db.collection('user_table');
const forecastJoin_table=db.collection('forecastJoin_table');
const _ = db.command
//用全局变量
var app = getApp()


Page({

  /**
   * 页面的初始数据
   */
  data: {
forecastId:null,
forecastIndex:null,
result:null,
//总积分
reward:null,
//预测成功的人的积分总和
sum:null,
//预测成功的用户id 和应该分配的积分数
successList:[],
//只保留了用户Id和获得积分的列表
lastList:[],

  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
this.getforecast()
  },

  getforecast(e){
   //从forecast表数据 
 //new Date() 获取当前时间
 // _.lte即数据库中 小于等于的 拿出来

   var d = new Date();
forecast_table.where({
 examine:1,
  endDate:_.lte(d)
}).get({
  success:(res)=>{
    console.log(res.data)

    this.setData({
      forecast:[...res.data],  
    })
    console.log(this.data.forecast)
    console.log('先拿forecast表数据 完成')
  
  },
  fail(err) {
 console.log('取数据失败')

  }
      
  })
  
     
  

  },
  
  getAgain(e){

    var d = new Date();
    forecast_table.where({
     examine:1,
      endDate:_.lte(d)
    }).skip(this.data.forecast.length).get({
      success:(res)=>{
      
        let arr=this.data.forecast
        //扩展运算符合并数组
           arr.push(...res.data)
        this.setData({
          forecast:arr,  
        })
        console.log(this.data.forecast)
        console.log('先拿forecast表数据 完成')
      
      },
      fail(err) {
     console.log('取数据失败')
    
      }
          
      })
      
  },
    /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
this.getAgain()
  },
//管理员选择正确结果后触发
  chooseResult(e){
  //弹出确认框
    wx.showModal({
      title: '提示',
      content: '确定结果为'+e.currentTarget.dataset.result+'?',
      success :res=> {
        if (res.confirm) {
          console.log('用户点击确定')

   //前端删除已公布预测
          let arr=this.data.forecast
         arr.splice(this.data.forecastIndex,1)
         this.setData({
           forecast:arr,
           result:e.currentTarget.dataset.result,
      
          })
       this.changeInfo()
       
        this.getInfo().then(this.giveReward)
         

         wx.showToast({
          title: '结果已公布！',
          duration: 1000,
          icon:'true',
        })
  
  
        } else if (res.cancel) {
          console.log('用户点击取消')
         

        }
      }
    })


  },

getId(e){
 console.log(e.currentTarget.dataset.index)
 console.log(e.currentTarget.dataset.forecastid) 
 this.setData({
   forecastIndex:e.currentTarget.dataset.index,
   forecastId:e.currentTarget.dataset.forecastid
 })

},
//修改forecast 和join表中result 等信息
changeInfo(e){
//更新数据
forecast_table.where({
  forecastId:this.data.forecastId
}).update({
  data: {
   endResult:this.data.result,
   examine:2,
 
  },
  success: res => {
  console.log('预测表信息更新成功')
  },
  fail: err => {
 
    console.error('[数据库] [更新记录] 失败：', err)
  }
})

forecastJoin_table.where({
  forecastId:this.data.forecastId
}).update({
  data: {
   result:this.data.result,
 
  },
  success: res => {
  console.log('预测参与表信息更新成功')
  },
  fail: err => {
 
    console.error('[数据库] [更新记录] 失败：', err)
  }
})

},
//获取一些计算获得积分所需的信息
getInfo(e){
//拿出总积分
var p=  new Promise((resolve,reject)=>{
  forecast_table.where({
 
    forecastId:this.data.forecastId
  }).get({
    success:(res)=>{
      
  
      this.setData({
        reward:res.data[0].reward,  
      })
      console.log(this.data.reward)
      console.log('拿出总积分 完成')
   
    },
    fail(err) {
   console.log('取数据失败')
   
    }
        
    })


  forecastJoin_table.where({
   
    forecastId:this.data.forecastId,
    forecastResult:this.data.result

  }).count({
    success:(res)=>{
     //计算从数据库取数据次数 一次只能取20条
      console.log(res.total)
      let people=res.total
      let a=parseInt(people/20)
       
       if(people%20!=0){ var b=1}
       else{b=0}
      let number=a+b
    console.log('循环次数'+number)
   //循环从数据库中取出所有预测成功的
   let x=0
   for(let i=0;i<number;i++){
   
    console.log(i)
    forecastJoin_table.where({
           forecastResult:this.data.result
    }).skip(i*20).get({
      success:(res)=>{
        console.log(res.data)
      //用x来判断是否循环了number次了
        x++
      
        let arr=this.data.successList
       arr.push(...res.data)
      
     
      if(x==number){
         //扩展运算符合并数组
        this.setData({
          successList:arr,  
        })
        console.log(this.data.successList)


var sum=0;
      
var list=this.data.successList
  //再把所有投入积分加起来 存到一个值sum当中
 
  list.forEach((item, index) => {
  
    sum=sum+item.inputNumber
 
  })
  console.log(sum)
  this.setData({
    sum:sum
  })

  //再计算出给每个人分配的比例
  let lastList=[]
  list.forEach((item, index) => {

  
   lastList.push({
  userId:item.userId,
 getNumber:parseInt((item.inputNumber/sum).toFixed(4)*this.data.reward)+1
    
   })
 
  })
  this.setData({
    lastList:lastList,
   
  })
  console.log(lastList)
//当lastlist得到数据后才往后面走
if(this.data.lastList.length!=0){
  console.log(this.data.lastList)
  resolve()}
      }//if(x==number)
       
       
       
      },
      fail(err) {
     console.log('取数据失败')
    
      }
          
      })

   }  






       

     
    }
        
    })


  })
  return p
},
//分配积分
giveReward(e){
//更新数据
console.log('开始分配积分')
for(let i=0;i<this.data.lastList.length;i++){
  
  forecastJoin_table.where({
    userId:this.data.lastList[i].userId,
    forecastId:this.data.forecastId,
    forecastResult:this.data.result
  }).update({
    data: {
     getNumber:this.data.lastList[i].getNumber
   
    },
    success: res => {
    // console.log(i+'getNumber信息更新成功')
    },
    fail: err => {
   
      console.error('[数据库] [更新记录] 失败：', err)
    }
  })

  user_table.where({
    userId:this.data.lastList[i].userId,
  }).update({
    data: {
     
    successNumber:_.inc(1),
     userNumber:_.inc(this.data.lastList[i].getNumber),
   
    },
    success: res => {
    // console.log('用户表信息更新成功')
    },
    fail: err => {
   
      console.error('[数据库] [更新记录] 失败：', err)
    }
  })





}





},

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },



  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})